import { getCartList,updateCartCount,deleteCart } from '@/api/cart.js'
import { Toast } from 'vant'
export default{
    namespaced:true,
    state(){
        return {
            cartList:[],//购物车列表
        }
    },
    mutations:{
        //提供一个设置cartList的mutation方法
        setCartList(state,newList){
            state.cartList = newList
        },
        // 切换购物车选中状态
        toggleCheck(state,goodsId){
            //让对应的id项数据，转态取反
            const goods = state.cartList.find(item=>item.goods_id === goodsId)
            goods.isChecked = !goods.isChecked
        },
        // 全选控制反选 全选控制小选的状态
        toggleAllCheck(state,flag){
            // 让小选同步全选的转态
            state.cartList.forEach(item=>item.isAllChecked = flag).for
        },
        // 本地修改数量
        updateNum(state,{goodsId,goodsNum}){
            const goods = state.cartList.find(item=>item.goods_id === goodsId)
            goods.goods_num = goodsNum
        }
    },
    // actions是转们处理异步操作的,这里我们来异步发送axios请求获取购物车列表数据
    actions:{
        async getCartAction(context){
            const res = await getCartList()
            const {data} = res
            //后台返回的数据，不包含购物车的选中状态，为了实现将来计算的功能
            // 需要给当前每一项数据，添加一个isChecked状态(标记当前商品是否选中)
            data.list.forEach(item=>{
                // 给每一个对象都先默认设置为true,选中状态
                item.isChecked = true
            })
            //提交给mutation
            context.commit('setCartList',data.list)
        },
        async updateCartNum(context,obj){
            const {goodsNum,goodsId,goodsSkuId} = obj
            // 跟新数据库
            const res = await updateCartCount(goodsNum,goodsId,goodsSkuId)
            //跟新vuex中的数据
            context.commit('updateNum',{goodsId,goodsNum})
        },
        // 删除选中的购物车数据
        async deleteCart(context){
            //通过context上下文，获取选中的购物车项，从而获取购物车的id
            const selCartList =  context.getters.selCartList
            const cartIds =  selCartList.map(item=>item.id)
            await deleteCart(cartIds)
            Toast.success('删除成功')

            //删除成功之后，重新拉取一下数据 action中调用其他action
            context.dispatch('getCartAction')
        }
    },
    getters:{
        // 1:求购物车所有的商品累加总数
        cartTotal(state){
            return state.cartList.reduce((sum ,item )=> sum + item.goods_num,0)
        },
        // 2:选中的总数
        selCount(state,getters){
            //getter中使用其他的getter方法
            return getters.selCartList.reduce((sum ,item )=> sum + item.goods_num,0)
        },
        // 3:选中的总价格
        selPrice(state,getters){
            return getters.selCartList.reduce((sum,item)=>{
                return sum + item.goods_num * item.goods.goods_price_min
            },0).toFixed(2)
        },
        //提供一个选中的商品项方法
        selCartList(state){
            return state.cartList.filter(item=>item.isChecked)
        },
        //是否全选,小选控制全选
        isAllChecked(state){
            return state.cartList.every(item => item.isAllChecked)
        },

    }
}